package settings

import (
	"fmt"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

// var Conf = new(AppConfig)

// type AppConfig struct {
// 	Name      string `mapstructure:"name"`
// 	Mode      string `mapstructure:"mode"`
// 	Version   string `mapstructure:"version"`
// 	StartTime string `mapstructure:"start_time"`
// 	MachineID int64  `mapstructure:"machine_id"`
// 	Port      int    `mapstructure:"port"`

// 	*LogConfig   `mapstructure:"log"`
// 	*MySQLConfig `mapstructure:"mysql"`
// 	*RedisConfig `mapstructure:"redis"`
// }

// type MySQLConfig struct {
// 	Host         string `mapstructure:"host"`
// 	User         string `mapstructure:"user"`
// 	Password     string `mapstructure:"password"`
// 	DB           string `mapstructure:"dbname"`
// 	Port         int    `mapstructure:"port"`
// 	MaxOpenConns int    `mapstructure:"max_open_conns"`
// 	MaxIdleConns int    `mapstructure:"max_idle_conns"`
// }

// type RedisConfig struct {
// 	Host         string `mapstructure:"host"`
// 	Password     string `mapstructure:"password"`
// 	Port         int    `mapstructure:"port"`
// 	DB           int    `mapstructure:"db"`
// 	PoolSize     int    `mapstructure:"pool_size"`
// 	MinIdleConns int    `mapstructure:"min_idle_conns"`
// }

// type LogConfig struct {
// 	Level      string `mapstructure:"level"`
// 	Filename   string `mapstructure:"filename"`
// 	MaxSize    int    `mapstructure:"max_size"`
// 	MaxAge     int    `mapstructure:"max_age"`
// 	MaxBackups int    `mapstructure:"max_backups"`
// }

func Init() (err error) {
	//读取配置文件
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath(".")
	viper.AddConfigPath("./settings")
	err = viper.ReadInConfig()
	if err != nil {
		fmt.Printf("viper.ReadInConfig fail err: %v\n", err)
		return
	}
	//把读取到的配置信息反序列化到Conf变量中
	// if err := viper.Unmarshal(Conf); err != nil {
	// 	fmt.Printf("viper.Unmarshal failed, err:%v\n", err)
	// }
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		// 配置文件发生变更之后会调用的回调函数
		fmt.Println("配置文件修改了:", e.Name)
		// if err := viper.Unmarshal(Conf); err != nil {
		// 	fmt.Printf("viper.Unmarshal failed, err:#{err}\n")
		// }
	})
	return
}
